/**
 * 本地存储工具类
 * 封装微信小程序的存储相关API
 */

// 存储键名常量
const STORAGE_KEY = {
  TOKEN_NAME: 'tokenName',
  TOKEN_VALUE: 'tokenValue',
  TOKEN: 'token',
  USER_INFO: 'userInfo',
  ADDRESSES: 'addresses',
  SEARCH_HISTORY: 'searchHistory',
  LOGS: 'logs',
  DOCTOR_TAGS: 'doctor_tags_' // 前缀，需要拼接医生ID
};

/**
 * 设置存储数据
 * @param {string} key - 键名
 * @param {any} data - 需要存储的数据
 * @param {boolean} sync - 是否同步操作，默认为true
 * @return {Promise|void} - 异步操作时返回Promise
 */
function set(key, data, sync = true) {
  if (sync) {
    try {
      wx.setStorageSync(key, data);
    } catch (e) {
      console.error('StorageError: 存储数据失败', e);
    }
  } else {
    return new Promise((resolve, reject) => {
      wx.setStorage({
        key,
        data,
        success: resolve,
        fail: (error) => {
          console.error('StorageError: 存储数据失败', error);
          reject(error);
        }
      });
    });
  }
}

/**
 * 获取存储数据
 * @param {string} key - 键名
 * @param {any} defaultValue - 默认值，当获取失败时返回
 * @param {boolean} sync - 是否同步操作，默认为true
 * @return {any|Promise} - 存储的数据或Promise
 */
function get(key, defaultValue = null, sync = true) {
  if (sync) {
    try {
      const value = wx.getStorageSync(key);
      return value !== '' ? value : defaultValue;
    } catch (e) {
      console.error('StorageError: 获取数据失败', e);
      return defaultValue;
    }
  } else {
    return new Promise((resolve, reject) => {
      wx.getStorage({
        key,
        success: (res) => resolve(res.data),
        fail: (error) => {
          console.error('StorageError: 获取数据失败', error);
          resolve(defaultValue);
        }
      });
    });
  }
}

/**
 * 移除存储数据
 * @param {string} key - 键名
 * @param {boolean} sync - 是否同步操作，默认为true
 * @return {Promise|void} - 异步操作时返回Promise
 */
function remove(key, sync = true) {
  if (sync) {
    try {
      wx.removeStorageSync(key);
    } catch (e) {
      console.error('StorageError: 移除数据失败', e);
    }
  } else {
    return new Promise((resolve, reject) => {
      wx.removeStorage({
        key,
        success: resolve,
        fail: (error) => {
          console.error('StorageError: 移除数据失败', error);
          reject(error);
        }
      });
    });
  }
}

/**
 * 清空所有存储数据
 * @param {boolean} sync - 是否同步操作，默认为true
 * @return {Promise|void} - 异步操作时返回Promise
 */
function clear(sync = true) {
  if (sync) {
    try {
      wx.clearStorageSync();
    } catch (e) {
      console.error('StorageError: 清空数据失败', e);
    }
  } else {
    return new Promise((resolve, reject) => {
      wx.clearStorage({
        success: resolve,
        fail: (error) => {
          console.error('StorageError: 清空数据失败', error);
          reject(error);
        }
      });
    });
  }
}

// 业务相关方法

/**
 * 设置令牌信息
 * @param {string} tokenName - 令牌名称 
 * @param {string} tokenValue - 令牌值
 */
function setToken(tokenName, tokenValue) {
  set(STORAGE_KEY.TOKEN_NAME, tokenName);
  set(STORAGE_KEY.TOKEN_VALUE, tokenValue);
}

/**
 * 获取令牌名称
 * @return {string} 令牌名称
 */
function getTokenName() {
  return get(STORAGE_KEY.TOKEN_NAME, '');
}

/**
 * 获取令牌值
 * @return {string} 令牌值
 */
function getTokenValue() {
  return get(STORAGE_KEY.TOKEN_VALUE, '');
}

/**
 * 获取授权令牌
 * @return {string} 授权令牌
 */
function getAuthToken() {
  return get(STORAGE_KEY.TOKEN, '');
}

/**
 * 设置授权令牌
 * @param {string} token - 授权令牌
 */
function setAuthToken(token) {
  set(STORAGE_KEY.TOKEN, token);
}

/**
 * 设置用户信息
 * @param {Object} userInfo - 用户信息对象
 */
function setUserInfo(userInfo) {
  set(STORAGE_KEY.USER_INFO, userInfo);
}

/**
 * 获取用户信息
 * @return {Object} 用户信息对象
 */
function getUserInfo() {
  return get(STORAGE_KEY.USER_INFO, {});
}

/**
 * 保存收货地址列表
 * @param {Array} addresses - 地址列表
 */
function setAddresses(addresses) {
  set(STORAGE_KEY.ADDRESSES, addresses);
}

/**
 * 获取收货地址列表
 * @return {Array} 地址列表
 */
function getAddresses() {
  return get(STORAGE_KEY.ADDRESSES, []);
}

/**
 * 保存搜索历史
 * @param {Array} history - 搜索历史列表
 */
function setSearchHistory(history) {
  set(STORAGE_KEY.SEARCH_HISTORY, history);
}

/**
 * 获取搜索历史
 * @return {Array} 搜索历史列表
 */
function getSearchHistory() {
  return get(STORAGE_KEY.SEARCH_HISTORY, []);
}

/**
 * 清空搜索历史
 */
function clearSearchHistory() {
  remove(STORAGE_KEY.SEARCH_HISTORY);
}

/**
 * 保存日志
 * @param {Array} logs - 日志列表
 */
function setLogs(logs) {
  set(STORAGE_KEY.LOGS, logs);
}

/**
 * 获取日志
 * @return {Array} 日志列表
 */
function getLogs() {
  return get(STORAGE_KEY.LOGS, []);
}

/**
 * 保存医生标签
 * @param {string} doctorId - 医生ID
 * @param {Array} tags - 标签列表
 */
function setDoctorTags(doctorId, tags) {
  set(`${STORAGE_KEY.DOCTOR_TAGS}${doctorId}`, tags);
}

/**
 * 获取医生标签
 * @param {string} doctorId - 医生ID
 * @return {Array} 标签列表
 */
function getDoctorTags(doctorId) {
  return get(`${STORAGE_KEY.DOCTOR_TAGS}${doctorId}`, []);
}

module.exports = {
  // 基础方法
  set,
  get,
  remove,
  clear,
  STORAGE_KEY,
  
  // 业务方法
  setToken,
  getTokenName,
  getTokenValue,
  getAuthToken,
  setAuthToken,
  setUserInfo,
  getUserInfo,
  setAddresses,
  getAddresses,
  setSearchHistory,
  getSearchHistory,
  clearSearchHistory,
  setLogs,
  getLogs,
  setDoctorTags,
  getDoctorTags
}; 